<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

//引入input类
use Input;

//引入DB类
use DB;

//模型的引入
use App\Member;

//引入Session类
use Session;

//引入Cache类
use Cache;

//引入主模型
use App\Article;

class TestController extends Controller
{
    public function test1()
    {
        phpinfo();
    }

    public function test2()
    {
        //1.获取sex参数的值，如果不存在则用0替换
        $data = Input::get('sex', 0);
        //2.获取全部的参数的值
        $data = Input::all();
        //3.获取id的参数的值
        $data = Input::get('id');
        //4.获取指定参数的值
        $data = Input::only(['id', 'age']);
        //5.获取除指定之外的参数的值
        $data = Input::except(['id', 'age']);
        //6.判断某个参数是否存在
        $data = Input::has('sex');
        dd($data);
    }

    //add方法
    public function add()
    {
        //insert 方法
        $data = [
            [
                'name' => '张三',
                'age' => 22,
                'email' => 'zhangsan@qq.com'
            ],
            [
                'name' => '李四',
                'age' => 26,
                'email' => 'lisi@qq.com'
            ],
            [
                'name' => '王五',
                'age' => 25,
                'email' => 'wangwu@qq.com'
            ],
        ];
        //$res = DB::table('member') -> insert($data);
        $res = DB::table('member')->insertGetId([
            'name' => '二牛',
            'age' => 23,
            'email' => 'erniu@qq.com'
        ]);
        dump($res);
    }

    //修改
    public function mod()
    {
        //将id为1的 name 修改为 张三丰
        //$res = DB::table('member')->where('id',1)->update(['name'=>'张三丰']);
        //递增操作
        $res = DB::table('member')->where('id', 1)->increment('age');
        dump($res);

    }

    //查
    public function select()
    {
        $db = DB::table('member');
        /*//查询全部的数据
        $data = $db->get();
        //循环取值
        foreach ($data as $key => $value){
            echo "id是：{$value->id},名字是:{$value->name},邮箱是:{$value->email}<br/>";
        }*/

        //查询id<3的数据
        /*$res = $db->where('id','<',3)->get();
        dump($res);*/

        //案例3：查询id>2且年龄<25
        /*$res = $db->where('id','>',2)->where('age','<',25)->get();
        dump($res);*/

        //取出单行数据
        /*$res = $db->where('id',2)->first();//返回值是一个对象
        dump($res);*/

        //获取某个具体的值(一个字段)
        /*$res = $db->where('id',3)->value('name');
        dump($res);*/

        //获取某些字段数据(多个字段)
        /*$users = $db->select('name','age')->get();
        dump($users);
        $users2 = $db->select('name as user_name')->get();
        dump($users2);*/

        //排序操作
        /*$res = $db->orderBy('age','asc')->get();
        dump($res);*/

        //分页操作
        $res = $db->offset(0)->limit(3)->get();
        dump($res);
    }

    //视图优先级测试
    public function test3()
    {
        //return view('admin/test/test3');
        $data = time();

        //演示compact 函数
        $data2 = 'aaa';
        $data3 = 'ccc';
        $data4 = ['1', '3'];
        //dump(compact('data','data2','data3','data4'));die;
        //return view('admin.test.test3',['data'=>$data]);
        return view('admin.test.test3', compact('data'));
    }

    //循环判断标签
    public function test4()
    {
        //查询数据
        $db = DB::table('member');
        $data = $db->get();

        //获取今天的星期数字
        $day = date('N');
        return view('admin.test.test4', compact('data', 'day'));
    }

    //模板继承测试
    public function test5()
    {
        return view('admin.test.test5');
    }

    //测试csrf
    //展示表单
    public function test6()
    {
        return view('admin.test.test6');
    }

    //处理提交
    public function test7()
    {
        return '转账成功！成功付款10000元';
    }

    //AR模式
    public function model_add(Request $request)
    {
        //实例化模型
        $model = new Member();//映射关系1：将表映射到属性
        //1.AR 模式进行增加
        //$model -> name = '买会员'; //映射关系2：将字段映射到属性
        //$model -> age =22;
        //$model -> email ='57878@qq.com';
        //$res = $model -> save(); //映射关系3：将记录映射到实例
        //2.自动创建方式添加
        //dd($request->all());//打印参数
        //$res = Member::create($request->all());

        //3.DB方式添加
        $res = Member::insert($request->all());
        dump($res);


    }

    public function test8()
    {
        return view('admin.test.test8');
    }

    //查询
    public function model_select()
    {
        //$res = Member::find(4)->toArray();
        //$res = Member::where('id','<',2)->all();
        $res = Member::where('id', '<', 2)->get();
        dump($res);
    }

    //修改
    public function model_mod()
    {
        //AR模式修改
        //要修改先查询
        //获取到需要修改的记录实例
        $data = Member::find(5);
        //通过给对象属性赋值的形式进行字段值的修改 进行修改 通过第二个映射关系：字段映射到属性，来确定需要修改的数据
        $data->email = 'admin@itcast.cn';
        //保存
        return $data->save() ? 'OK' : 'No OK';

        // Member::where('id',5)->update(['email'=>'admin@itcast.cn']);
    }

    //删除
    public function model_del()
    {
        //先查询要删除的记录
        $data = Member::find(5);
        //删除
        return $data->delete() ? 'OK' : 'No OK';
    }

    //自动验证
    public function test9(Request $request)
    {
        //1.验证数据的合法性
        $this->validate($request, [
                'name' => 'required|unique:member|min:2|max:20',
                'age' => 'required|min:1|max:100|integer',
                'email' => 'required|email',
                'yzm' => 'required|captcha',//captcha规则用于验证验证码是否正确
            ]
        // ,[
        // 'name.required' =>'用户名不能为空'
        // ]
        );
        //此处处理文件上传
        //判断文件是否上传正常与存在
        if ($request->hasFile('avatar') && $request->file('avatar')->isValid()) {
            //对文件进行重新的命名
            $name = sha1(time() . rand(100000, 999999)) . '.' . $request->file('avatar')->extension();
            //文件的移动操作
            $request->file('avatar')->move('./statics/upload', $name);
            $path = '/statics/upload/' . $name;
        }
        //2.通过验证 后写入数据表
        $data = $request->except(['_token', 'avatar', 'yzm']);
        $data['avatar'] = isset($path) ? $path : '';
        $result = Member::insert($data);
        if ($result) {
            return redirect('/');
        } else {
            return redirect('test8')->withErrors(['用户添加失败！']);
        }
        //3.告知用户操作是否成功
        //return $result ? 'OK' : 'Fail';
    }

    //分页测试
    public function test10()
    {
        //
        //$data = Member::all();
        $data = Member::paginate(1);
        //渲染页面和变量分配
        return view('admin.test.test10', compact('data'));
    }

    //json响应
    public function test11()
    {
        //获取member表数据
        $data = Member::all();
        //输出json
        return response()->json($data);
    }


    //Session
    public function test12()
    {
        //设置一个session信息
        dump(Session::put('name', '二狗'));
        //2.获取一个session信息
        dump(Session::get('name'));
        dump(Session::get('wangji', '你好'));
        dump(Session::get('wangji', function () {
            return Member::all();
        }));
        //3.获取所有的session信息
        dump(Session::all());
        //4.删除单个session
        dump(Session::forget('name'));
        //5.判断是否存在
        dump(Session::has('name'));
        //6.删除全部
        dump(Session::flush());
    }

    //缓存 Cache
    public function test13()
    {
        //1.设置缓存
        //dump(Cache::put('name','二狗',10));
        //dump(Cache::add('name','杀掉',10));
        //dump(Cache::forever('key','拉拉'));

        //2.获取缓存
        //dump(Cache::get('name'));
        //dump(Cache::get('names','🌭'));
        //dump(Cache::get('name1',function(){
        //return '🐎🐂';
        //}));
        //dump(Cache::has('aaa'));

        //3.删除缓存
        //dump(Cache::pull('name1'));//获取之后再删除
        //dump(Cache::forget('key'));//直接删除缓存项  true
        //dump(Cache::flush());//移除全部的缓存 //true

        //4.递增和递减
        Cache::add('count', 1, 10);
        //Cache::increment('count',1);//递增
        //Cache::decrement('count',1);//递减
        //dump(Cache::get('count'));

        //获取并缓存
        $data = Cache::remember('ak', 1, function () {
            return md5(time());
        });
        dump($data);
    }

    public function getAccessToken()
    {
        //从缓存中获取，如果没有过期使用之前的，如果过期则获取最新的
        return Cache::remember('access_token', 100, function () {
            //接口请求地址
            $api = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=' . config('common.appID') . '&secret=' . config('common.appsecret');
            $data = $this->http_get($api);
            $tmpArr = json_decode($data, true);
            $accessToken = $tmpArr['access_token'];
            return $accessToken;
        });
    }

    public function test14()
    {
        //select t1.id,t1.article_name as article_name,t2.author_name as author_name from article as t1 left join author as t2 on t1.author_id = t2.id;
        $data = DB::table('article as t1')
            ->select('t1.id', 't1.article_name as article_name', 't2.author_name as author_name')
            ->leftJoin('author as t2', 't1.author_id', '=', 't2.id')
            ->get();
        dump($data);

    }

    public function test15()
    {
        //查询文章的信息
        $data = Article::all();
        //挨个循环模型
        foreach ($data as $key => $value) {
            # value是一个模型对象
            echo '文章id:' . $value->id . '<br>';
            echo '文章名称:' . $value->article_name . '<br>';
            echo '文章作者:' . $value->rel_author->author_name . '<br>';
            echo '<hr>';
        }
    }

    public function test16()
    {
        //查询文章的信息
        $data = Article::all();
        //挨个循环模型
        foreach ($data as $key => $value) {
            # value是一个模型对象
            echo '文章id:' . $value->id . '<br>';
            echo '文章名称:' . $value->article_name . '<br>';
            //继续循环输出评论
            foreach ($value->rel_comment as $k => $v) {
                echo '&emsp;&emsp;' . $v->comment . '<br>';
            }

            echo '<hr>';
        }
    }

    //关联关系：多对多
    public function test17(){
        //查询文章
        $data = Article::all();
        //循环
        foreach ($data as $key=>$value){
            # value是文章模型对象
            echo '文章id:' . $value->id . '<br>';
            echo '文章名称:' . $value->article_name . '<br>';
            //继续循环关键词
            foreach ($value->rel_keyword as $k => $v) {
                echo '&emsp;&emsp;' . $v->keyword . '<br>';
            }

            echo '<hr>';
        }
    }
}
